package guigu.GenericClassMethod;

import org.junit.Test;

import java.util.List;

/**
 * 如何自定义泛型结构：泛型类、泛型接口、泛型方法
 *
 * 1、关于自定义泛型类、泛型接口：
 *    注意：① 泛型类的构造器如下：public GenericClass(){}
 *            而下面是错误的：public GenericClass<>(){}
 *          ②泛型不同的引用不能相互赋值。
 *          ③如果泛型结构是一个接口或抽象类，则不能创建泛型类的对象
 *          ④在静态方法中不能使用类的泛型
 *          ⑤异常类不能是泛型类的。
 *
 */
public class GenericTest {
    //如果定义了泛型类，实例化没有指明类的泛型，则认为此泛型类型为Object类型
    //要求：如果大家定义了类是带泛型的，建议在实例化时要指明类的泛型。
    @Test
    public void test1()
    {
        Order order = new Order();
        order.setOrderT(123);
        order.setOrderT("ABC");

        //建议：实例化时指明类的泛型
        Order<String> order1 = new Order<String>("orderAA",125,"order:AA");
        order1.setOrderT("hello");
    }

    //子类继承说明
    @Test
    public void test2()
    {
        SubOrder sub1 = new SubOrder();
        //由于子类在继承带泛型的父类时，指明了泛型类型，则实例化子类对象时，不在需要指明泛型。
        sub1.setOrderT(122);
    }

    @Test
    public void test3()
    {
        SubOrder1<String> subOrder1 = new SubOrder1<>();
        subOrder1.setOrderT("ASF");
        System.out.println(subOrder1);

        //在静态方法中不能使用类的泛型
      /*  public static void show(T oderT)
        {
            System.out.println(orderT);
        }*/
    }

    @Test
    public void test4()
    {
        Order<String> order = new Order();
        Integer arr[] = new Integer[]{1,23,5,6,8};
        //泛型方法在调用时，指明泛型参数的类型
        List<Integer> list = order.copyFromArrayToList(arr);
        System.out.println(list);
    }

}
